package com.example.OnlineStorage.Dao;

import com.example.OnlineStorage.pojo.entity.Pagination;
import com.example.OnlineStorage.pojo.entity.ShareFilePermissions;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

/**
 * 分享文件权限数据访问接口。
 * 该接口定义了对分享文件权限数据的增删改查操作，用于与数据库交互。
 */
@Mapper
@Repository
public interface ShareFilePermissionsDao {

    /**
     * 插入分享文件权限信息。
     *
     * @param shareFilePermissions 待插入的分享文件权限实体。
     * @return 返回插入操作影响的行数。
     */
    Integer insert(ShareFilePermissions shareFilePermissions);

    /**
     * 根据ID删除分享文件权限信息。
     *
     * @param Id 权限ID，用于指定删除操作的影响范围。
     * @return 返回删除操作影响的行数。
     */
    Integer delete(Long Id);

    /**
     * 更新分享文件权限信息。
     *
     * @param shareFilePermissions 待更新的分享文件权限实体。
     * @return 返回更新操作影响的行数。
     */
    Integer update(ShareFilePermissions shareFilePermissions);

    /**
     * 查询一条分享文件权限信息。 用于更新、删除之前的查询验证
     * @param shareFilePermissions 要查询的权限对象要求有 userId 和 shareFileId
     * @return 分享文件权限信息的权限位
     */
    Long select(ShareFilePermissions shareFilePermissions);
    
    /**
     * 查询一个共享文件夹有多少条权限信息
     *
     * @param shareFileId 共享文件ID
     * @return count 共享文件权限信息条数
     */
    Long selectCountByShareFileId(@Param("shareFileId") Long shareFileId);

    /**
     * 根据共享文件ID和分页信息 查询一个共享文件夹所有的权限信息
     * @param shareFileId 共享文件夹ID
     * @param pagination 分页对象
     * @return 共享文件权限信息数组
     */
    ShareFilePermissions[] selectByShareFileId(@Param("shareFileId") Long shareFileId, @Param("pagination") Pagination pagination);

    /**
     * 根据用户ID和分页信息查询用户加入的共享文件夹信息包括权限信息
     *
     * @param userId     用户ID，用于指定查询范围。
     * @param pagination 分页对象
     * @return 用户加入的共享文件夹信息包括权限信息的数组
     */
    ShareFilePermissions[] selectByUserId(@Param("userId") Long userId, @Param("pagination") Pagination pagination);
}
